package com.jxdinfo.hussar.example.common.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@Component
@ServerEndpoint("/websocket/mqtt")
@Slf4j
public class WsServer {

    // 用来存储每一个客户端对象对应的WsController对象
    private static Map<String, WsServer> onlineUsers = new ConcurrentHashMap<>();

    // 声明Session对象，通过该对象可以给指定的用户发送请求
    private Session session;

    // 声明一个HttpSession对象，之前在HttpSession中存储了用户名
    private HttpSession httpSession;

    /**
     * 连接建立时被调用
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config){
        // 将局部的session对象赋值给成员session对象
        this.session=session;
        // 获取httpSession对象
        HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        this.httpSession = httpSession;

        String username = (String) httpSession.getAttribute("user");

        // 将当前对象存储到容器中
        onlineUsers.put(username, this);

        // 将当前在线用户的用户名推送给所有客户端

    }

    /**
     * 接收到客户端消息时被调用
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @OnMessage
    public void onMessage(String message,Session session){

    }

    /**
     * 连接被关闭时调用
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @OnClose
    public void onClose(Session session){

    }


    /**
     * 将消息广播给所有用户
     * 将对象转为json字符串传递
     * @author 二饭
     * @email 1786705138@qq.com
     */
    public void broadcastAllUser(String message){
        try {
            Set<String> strings = onlineUsers.keySet();
            for(String name:strings){
                WsServer wsServer = onlineUsers.get(name);
                wsServer.session.getBasicRemote().sendText(message);
            }
        }catch (Exception ex){
            log.error("广播消息出现异常");
            ex.printStackTrace();

        }

    }

}

